﻿using System;
using System.Windows.Data;
using LiveTiss.Schemas;

namespace LiveTiss.Classes.TypeConverter
{
    public class EnumConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Enum && parameter is string)
            {
                string key = Util.ConvertToString(value as Enum);
                var list = XML_enum.GetEnum(parameter.ToString());

                int index = -1;
                if (list != null)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        if (list[i].Key.ToLower().Equals(key.ToLower()))
                        {
                            index = i;
                            break;
                        }
                    }
                }

                return index;
            }
            else
            {
                return -1;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is int && parameter is string)
            {
                var index = (int)value;
                if (index >= 0)
                {
                    var list = XML_enum.GetEnum(parameter.ToString());
                    switch (parameter.ToString())
                    {
                        case "AtendimentoOdonto":
                            return (st_atendimentoOdonto)Util.ConvertToEnum<st_atendimentoOdonto>(list[index].Key);
                        case "CBOS":
                            return (st_CBOS)Util.ConvertToEnum<st_CBOS>(list[index].Key);
                        case "CodigoFontePagadora":
                            return (ItemChoiceType1)Util.ConvertToEnum<ItemChoiceType1>(list[index].Key);
                        case "CodigoOperadora":
                            return (ItemChoiceType)Util.ConvertToEnum<ItemChoiceType>(list[index].Key);
                        case "ConselhoProfissional":
                            return (st_conselhoProfissional)Util.ConvertToEnum<st_conselhoProfissional>(list[index].Key);
                        case "Dente":
                            return (st_dente)Util.ConvertToEnum<st_dente>(list[index].Key);
                        case "DenteRegiao":
                            return (ItemChoiceType8)Util.ConvertToEnum<ItemChoiceType8>(list[index].Key);
                        case "EletivaEmergencia":
                            return (st_eletivaEmergencia)Util.ConvertToEnum<st_eletivaEmergencia>(list[index].Key);
                        case "IdentificacaoPrestador":
                            return (ItemChoiceType2)Util.ConvertToEnum<ItemChoiceType2>(list[index].Key);
                        case "IdentificacaoPrestadorEquipe":
                            return (ItemChoiceType4)Util.ConvertToEnum<ItemChoiceType4>(list[index].Key);
                        case "IdentificacaoProfissionalCompl":
                            return (ItemChoiceType3)Util.ConvertToEnum<ItemChoiceType3>(list[index].Key);
                        case "IndicadorAcidente":
                            return (st_indicadorAcidente)Util.ConvertToEnum<st_indicadorAcidente>(list[index].Key);
                        case "MotivoSaida":
                            return (st_motivoSaida)Util.ConvertToEnum<st_motivoSaida>(list[index].Key);
                        case "ObitoMulher":
                            return (st_obitoMulher)Util.ConvertToEnum<st_obitoMulher>(list[index].Key);
                        case "ObitoNeonatal":
                            return (ItemChoiceType5)Util.ConvertToEnum<ItemChoiceType5>(list[index].Key);
                        case "PosicaoProfissao":
                            return (st_posicaoProfissao)Util.ConvertToEnum<st_posicaoProfissao>(list[index].Key);
                        case "RegimeInternacao":
                            return (st_regimeInternacao)Util.ConvertToEnum<st_regimeInternacao>(list[index].Key);
                        case "Tabela":
                            return (st_tabela)Util.ConvertToEnum<st_tabela>(list[index].Key);
                        case "TecnicaUtilizada":
                            return (st_tecnicaUtilizada)Util.ConvertToEnum<st_tecnicaUtilizada>(list[index].Key);
                        case "TipoAcomodacao":
                            return (st_tipoAcomodacao)Util.ConvertToEnum<st_tipoAcomodacao>(list[index].Key);
                        case "TipoAtendimento":
                            return (st_tipoAtendimento)Util.ConvertToEnum<st_tipoAtendimento>(list[index].Key);
                        case "TipoConsulta":
                            return (st_tipoConsulta)Util.ConvertToEnum<st_tipoConsulta>(list[index].Key);
                        case "TipoDoenca":
                            return (st_tipoDoenca)Util.ConvertToEnum<st_tipoDoenca>(list[index].Key);
                        case "TipoFaturamento":
                            return (st_tipoFaturamento)Util.ConvertToEnum<st_tipoFaturamento>(list[index].Key);    
                        case "TipoInternacao":
                            return (st_tipoInternacao)Util.ConvertToEnum<st_tipoInternacao>(list[index].Key);
                        case "TipoLogradouro":
                            return (st_tipoLogradouro)Util.ConvertToEnum<st_tipoLogradouro>(list[index].Key);
                        case "TipoSaidaGuiaConsulta":
                            return (st_tipoSaidaGuiaConsulta)Util.ConvertToEnum<st_tipoSaidaGuiaConsulta>(list[index].Key);
                        case "TipoSaidaGuiaSADT":
                            return (st_tipoSaidaGuiaSADT)Util.ConvertToEnum<st_tipoSaidaGuiaSADT>(list[index].Key);
                        case "UF":
                            return (st_UF)Util.ConvertToEnum<st_UF>(list[index].Key);
                        case "UnidadeTempo":
                            return (st_unidadeTempo)Util.ConvertToEnum<st_unidadeTempo>(list[index].Key);
                        case "Regiao":
                            return (st_regiao)Util.ConvertToEnum<st_regiao>(list[index].Key);
                        case "ViaDeAcesso":
                            return (st_viaDeAcesso)Util.ConvertToEnum<st_viaDeAcesso>(list[index].Key);
                    }
                }
            }
            return null;
        }

        #endregion
    }
}
